/*
 * @Description: 
 * @Author: Junhuang
 * @Date: 2022-02-15 16:56:55
 * @LastEditTime: 2022-03-18 14:51:50
 * @LastEditors: Junhuang
 * @Reference: 
 */
'use strict';

const await = require('await-stream-ready/lib/await');
const { apiSuccesss } = require('../extend/context');

const Controller = require('egg').Controller;

// 参数校验规则
const rules = {
  no: { type: 'number', required: true, desc: '集号' },
  title: { type: 'string', required: true, desc: '视频标题' },
  url: { type: 'string', required: true, desc: '视频地址' },
  video_id: { type: 'int', required: true, desc: '作品ID' },
  description: { type: 'string', required: false, desc: '描述' },
}

class Video_detailController extends Controller {

  async index() {
    const { ctx, app } = this;
    // 参数验证
    ctx.validate({
      video_id: {
        required: true,
        type: 'int',
        desc: '作品id'
      },
    });

    let video_id = ctx.query.video_id;
    let res = await app.model.VideoDetail.findAll({
      where: {
        video_id
      },
      order: [['no', 'ASC']],
      // 增加字段video,让其值=url，因为前台需要
      attributes: { include: [['url', 'video']] }
    })

    ctx.apiSuccesss(res);
  }

  async save() {
    const { ctx, app } = this;
    const { no, title, video_id, url, description } = ctx.request.body;
    // 参数验证
    ctx.validate(rules);
    let user_id = ctx.authUser.id;

    // 先需要通过video_id 和 user_id 查询数据库中是否有属于此用户的这个作品
    let video = await app.model.Video.findOne({
      where: {
        id: video_id,
        user_id
      }
    })
    if (!video) {
      ctx.throw(404, '所属作品不存在');
    }
    // 【特别注意】：VideoDetail的驼峰式写法
    let video_detail = await app.model.VideoDetail.create({
      no, title, url, video_id, description
    });

    ctx.apiSuccesss(video_detail);
  }

  // 修改视频
  async update() {
    const { ctx, app } = this;
    const { no, title, video_id, url, description } = ctx.request.body;
    const id = ctx.params.id;
    // 参数验证
    ctx.validate({
      id: {
        type: 'int', required: true, desc: '视频id'
      },
      ...rules
    });
    let user_id = ctx.authUser.id;

    // 先需要通过video_id 和 user_id 查询数据库中是否有属于此用户的这个作品
    let video = await app.model.Video.findOne({
      where: {
        id: video_id,
        user_id
      }
    })
    if (!video) {
      ctx.throw(404, '所属作品不存在');
    }
    // 【特别注意】：注意VideoDetail的驼峰式写法
    let vd = await app.model.VideoDetail.findOne({
      where: {
        id,
        video_id
      }
    })

    if (!vd) {
      ctx.throw(404, '该视频不存在');
    }

    let rs = await vd.update({
      no, title, url, video_id, description
    });

    ctx.apiSuccesss(rs);
  }

  // 删除
  async destroy() {
    const { ctx, app } = this;
    const { id } = ctx.request.body;
    const currentUser = ctx.authUser;
    ctx.validate({
      id: {
        type: 'int', required: true, desc: '视频id'
      },
    })
    // 注意VideoDetail的驼峰式写法
    // 【特别注意】：此处的关联查询，不仅该视频要存在，且该视频所属的作品要是该用户的才行
    let vd = await app.model.VideoDetail.findOne({
      where: {
        id
      },
      include: [{
        model: app.model.Video,
        where: {
          user_id: currentUser.id
        }
      }]
    })

    if (!vd) {
      return ctx.throw('该记录不存在或该记录不属于当前用户');
    }

    let res = await vd.destroy();
    ctx.apiSuccesss(res);
  }
}

module.exports = Video_detailController;
